Практика использования запросов

1. Что делает VACUUM FULL по шагам:

  1. Блокирует таблицу целиком — устанавливает ACCESS EXCLUSIVE lock. Ни SELECT, ни UPDATE, ни другие операции на таблице невозможны во время выполнения.
  2. Создаёт копию таблицы — PostgreSQL создает новую временную таблицу с теми же данными, но без "мертвых" строк.
  3. Удаляет старую таблицу и заменяет её на новую.
  4. Обновляет индексы и метаданные.
  5. Возвращает неиспользуемое дисковое пространство обратно операционной системе.

2. Команда EXPLAIN показывает план выполнения запроса — то, как PostgreSQL собирается его исполнять.

EXPLAIN SELECT * FROM users WHERE email = 'a@example.com'; 

Пример вывода:

Index Scan using idx_user_email on users (cost=0.29..8.30 rows=1 width=100) Index Cond: (email = 'a@example.com')

Это хорошо — используется Index Scan. Плохой вариант — Seq Scan (полный перебор).


EXPLAIN ANALYZE

Если добавить ANALYZE, PostgreSQL реально выполнит запрос и покажет фактическое время и кол-во строк.

`EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'a@example.com';`

Как интерпретировать план

Элемент Значение
Seq Scan Последовательное сканирование таблицы
Index Scan Используется индекс
Bitmap Index Scan + Bitmap Heap Scan Промежуточный компромисс для нескольких условий
Nested Loop, Hash Join, Merge Join Алгоритмы соединения таблиц
cost=X..Y Примерная стоимость начала и окончания
rows=Z Оценка количества строк
actual time Фактическое время (при EXPLAIN ANALYZE)

3. курсор (cursor)

механизм, позволяющий пошагово обрабатывать результат SQL-запроса, особенно когда:

  • результат слишком большой, чтобы загружать весь сразу;
  • нужно перебирать строки по одной (или порциями);
  • используется циклическая логика в хранимых процедурах или PL/pgSQL-скриптах.

Что делает DECLARE c CURSOR FOR SELECT count(*) FROM accounts;

Эта команда:

  • создаёт курсор с именем c, привязанный к результату запроса SELECT count(*) FROM accounts.
  • не выполняет запрос сразу, а регистрирует его в планировщике.
  • Позволяет позже выполнить FETCH, чтобы извлечь данные.

## Виды JOIN и в чём их отличия

Вид JOIN Синоним Что делает
INNER JOIN JOIN Возвращает только совпадающие строки из обеих таблиц (по условию ON)
LEFT JOIN Возвращает все строки из левой таблицы, и совпадающие из правой (или NULL)
RIGHT JOIN Возвращает все строки из правой таблицы, и совпадающие из левой (или NULL)
FULL OUTER JOIN Возвращает все строки из обеих таблиц, заполняя NULL, если совпадения нет
CROSS JOIN Возвращает декартово произведение — каждая строка левой с каждой правой